//package com.charley.icloud.aop;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.charley.icloud.common.utils.IpUtils;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.Arrays;
//
///**
// * 接口访问请求日志切面
// * @author charley
// * @date 2024-4-16 14:12
// * */
//@Aspect
//@Component
//public class RequestLogAspect {
//    Logger logger = LoggerFactory.getLogger(RequestLogAspect.class);
//
//    /**
//     *  切面连接点
//     **/
//    @Pointcut("execution( * com.charley.icloud.controller..*(..))")
//    public void logPointcut(){}
//
//    /**
//     *  采用环绕通知，记录用户操作行为
//     **/
//    @Around("logPointcut()")
//    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//
//        logger.info("RequestLogAspect -----> doAround() 方法执行了......");
//
//        // 获取request对象
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        assert attributes != null;
//        HttpServletRequest request = attributes.getRequest();
//
//        // 记录下请求内容
//        logger.info("\n\t\tURL : " + request.getRequestURL().toString() +
//                "\n\t\tIP : " + request.getRemoteAddr() +
//                "\n\t\tCLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName() +
//                "\n\t\tARGS : " + Arrays.toString(joinPoint.getArgs()));
//
//        // 设置初始大小16，输出有序
//        JSONObject requestObject = new JSONObject();
//        // 方式
//        requestObject.put("request_method",request.getMethod());
//        // 地址
//        requestObject.put("request_uri",request.getRequestURI());
//        //requestObject.put("request_url",request.getRequestURL());
//        // 参数
//        requestObject.put("request_params", JSON.toJSON(joinPoint.getArgs()));
//        //UserMapper-Agent
//        requestObject.put("user_agent",request.getHeader("UserMapper-Agent"));
//        //requestObject.put("user_agent", request.getHeader("SysUserMapper-Agent"));
//        //Referer
//        requestObject.put("referer",request.getHeader("Referer"));
//        // 用户真实地址
//        requestObject.put("real_ip", IpUtils.getIpAddress(request));
//        // 请求开始时间
//        long start = System.currentTimeMillis();
//        requestObject.put("request_start_time",start);
//        // 日志打印
//        logger.info("接口请求信息：[{}]",requestObject.toJSONString());
//        // 拦截响应信息
//        Object result = joinPoint.proceed();
//        JSONObject responseObject = new JSONObject();
//        responseObject.put("response_info",JSON.toJSON(result));
//
//        // 过滤掉一些不需要打印日志的接口 范例如下
//        /*if(!request.getRequestURL().toString().contains("export/bj/report")) {
//            responseObject.put("response_info", JSON.toJSON(result));
//        }else {
//            // 如果是下载报告接口，就不需要将最终结果打印
//            responseObject.put("response_info", "报告下载成功");
//        }*/
//
//        //请求结束时间
//        long end = System.currentTimeMillis();
//        responseObject.put("request_end_time",end);
//        // 请求时间
//        responseObject.put("request_time",end-start);
//        // 日志打印
//        logger.info("接口响应信息：[{}]",responseObject.toJSONString());
//        return result;
//    }
//}
